home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Plus 1997 #3
/
Amiga Plus CD - 1997 - No. 03.iso
/
pd
/
programmierung
/
alienbreed3d2_src
/
cheesesauce
/
newplayershoot.s
< prev
next >
Wrap
Text File
|
1997-01-31
|
17KB
|
1,094 lines
PLR1_clicked: dc.b 0
PLR2_clicked: dc.b 0
popping: ds.l 5*4
targdist: dc.w 0
targetydiff: dc.l 0
PLR1_TimeToShoot: dc.w 0
PLR2_TimeToShoot: dc.w 0
MaxFrame: dc.w 0
BULTYPE: dc.w 0
AmmoInMyGun: dc.w 0
Player1Shot:
tst.w PLR1_TimeToShoot
beq.s okcanfire
move.w TempFrames,d0
sub.w d0,PLR1_TimeToShoot
bge PLR1_nofire
move.w #0,PLR1_TimeToShoot
bra PLR1_nofire
okcanfire:
moveq #0,d0
move.b p1_gunselected,d0
move.b d0,tempgun
move.l LINKFILE,a6
lea GunBulletTypes(a6),a6
lea BulletAnimData-GunBulletTypes(a6),a5
lea (a6,d0.w*8),a6
move.w G_BulletType(a6),d0 ; bullet type
move.w d0,BULTYPE
move.l #PLAYERONEAMMO,a0
move.w (a0,d0.w*2),AmmoInMyGun
muls #B_BulStatLen,d0
add.w d0,a5
move.w B_MovementSpeed+2(a5),BulletSpd
; tst.w (a6)
; beq.s .itsaclick
tst.b p1_fire
beq PLR1_nofire
; bra .itsahold
;
;.itsaclick:
; tst.b p1_clicked
; beq PLR1_nofire
;
;.itsahold:
move.w PLR1_angpos,d0
move.l #SineTable,a0
lea (a0,d0.w),a0
move.w (a0),tempxdir
move.w 2048(a0),tempzdir
move.w PLR1_xoff,tempxoff
move.w PLR1_zoff,tempzoff
move.l PLR1_yoff,tempyoff
add.l #20*128,tempyoff
move.b PLR1_StoodInTop,tempStoodInTop
move.l PLR1_Roompt,tempRoompt
move.l #%100011,d7
move.w #-1,d0
move.l #0,targetydiff
move.l #$7fff,d1
move.l ZoneAdds,a3
move.l #PLR1_ObsInLine,a1
move.l ObjectData,a0
move.l #PLR1_ObjDists,a2
findclosestinline
tst.w (a0)
blt outofline
cmp.b #3,16(a0)
beq notlinedup
tst.b (a1)+
beq.s notlinedup
btst #0,17(a0)
beq.s notlinedup
tst.w 12(a0)
blt.s notlinedup
move.b 16(a0),d6
btst d6,d7
beq.s notlinedup
tst.b numlives(a0)
beq.s notlinedup
move.w (a0),d5
move.w (a2,d5.w*2),d6
move.w 4(a0),d2
ext.l d2
asl.l #7,d2
sub.l PLR1_yoff,d2
move.l d2,d3
bge.s .oknotneg
neg.l d2
.oknotneg:
divs #44,d2
cmp.w d6,d2
bgt.s notlinedup
cmp.w d6,d1
blt.s notlinedup
move.w d6,d1
move.l a0,a4
; We have a closer enemy lined up.
move.l d3,targetydiff
move.w d5,d0
notlinedup:
add.w #64,a0
bra findclosestinline
outofline:
move.w d1,targdist
move.l targetydiff,d5
sub.l PLR1_height,d5
add.l #18*256,d5
move.w d1,closedist
move.w BulletSpd,d2
asr.w d2,d1
tst.w d1
bgt.s okdistthing
moveq #1,d1
okdistthing
divs d1,d5
move.w d5,bulyspd
move.w AmmoInMyGun,d2
move.w G_BulletsPerShot(a6),d1
cmp.w d1,d2
bge.s .okcanshoot
move.l PLR1_Obj,a2
move.w (a2),d0
move.l #ObjRotated,a2
move.l (a2,d0.w*8),Noisex
move.w #300,Noisevol
move.w #100,PLAYERONENOISEVOL
move.w #12,Samplenum
clr.b notifplaying
move.b #$fb,IDNUM
jsr MakeSomeNoise
rts
.okcanshoot:
cmp.b #'s',mors
beq.s .notplr1
move.l PLR1_Obj,a2
move.w #1,ObjTimer+128(a2)
.notplr1
move.w G_DelayBetweenShots(a6),PLR1_TimeToShoot
move.b MaxFrame,PLR1_GunFrame
sub.w d1,d2
move.l #PLAYERONEAMMO,a2
add.w BULTYPE,a2
add.w BULTYPE,a2
move.w d2,(a2)
move.l PLR1_Obj,a2
move.w (a2),d2
move.l #ObjRotated,a2
move.l (a2,d2.w*8),Noisex
move.w #100,PLAYERONENOISEVOL
move.w #300,Noisevol
move.w G_SoundEffect(a6),Samplenum
move.b #2,chanpick
clr.b notifplaying
movem.l d0/a0/d5/d6/d7/a6/a4/a5,-(a7)
move.b #$fb,IDNUM
jsr MakeSomeNoise
movem.l (a7)+,d0/a0/d5/d6/d7/a6/a4/a5
tst.w d0
blt nothingtoshoot
tst.l B_Gravity(a5)
beq.s .notuseaim
move.w PLR1_AIMSPD,d2
move.w #8,d1
sub.w BulletSpd,d1
asr.w d1,d2
move.w d2,bulyspd
.notuseaim
tst.w B_VisibleOrInstant+2(a5)
beq PLR1FIREBULLET
; instant effect: check for hitting:
move.w G_BulletsPerShot(a6),d7
FIREBULLETS:
movem.l a0/a1/d7/d0/a4/a5,-(a7)
jsr GetRand
move.l ObjectPoints,a1
move.w (a4),d1
lea (a1,d1.w*8),a1
and.w #$7fff,d0
move.w (a1),d1
sub.w PLR1_xoff,d1
muls d1,d1
move.w 4(a1),d2
sub.w PLR1_zoff,d2
muls d2,d2
add.l d2,d1
asr.l #6,d1
ext.l d0
asl.l #1,d0
cmp.l d1,d0
bgt.s .hitplr
movem.l (a7)+,a0/a1/d7/d0/a5/a4
move.l d0,-(a7)
bsr PLR1MISSINSTANT
move.l (a7)+,d0
bra.s .missplr
.hitplr:
movem.l (a7)+,a0/a1/d7/d0/a5/a4
move.l d0,-(a7)
bsr PLR1HITINSTANT
move.l (a7)+,d0
.missplr:
subq #1,d7
bgt.s FIREBULLETS
rts
PLR1_AIMSPD: dc.l 0
nothingtoshoot:
move.w PLR1_AIMSPD,d0
move.w #8,d1
sub.w BulletSpd,d1
asr.w d1,d0
move.w d0,bulyspd
tst.w B_VisibleOrInstant+2(a5)
beq PLR1FIREBULLET
move.w #0,bulyspd
move.w PLR1_xoff,oldx
move.w PLR1_zoff,oldz
move.w PLR1_sinval,d0
asr.w #7,d0
add.w oldx,d0
move.w d0,newx
move.w PLR1_cosval,d0
asr.w #7,d0
add.w oldz,d0
move.w d0,newz
move.l PLR1_yoff,d0
add.l #20*128,d0
move.l d0,oldy
move.l d0,d1
jsr GetRand
and.w #$fff,d0
sub.w #$800,d0
ext.l d0
add.l d0,d1
move.l d1,newy
st exitfirst
clr.b wallbounce
move.w #0,extlen
move.b #$ff,awayfromwall
move.w #%0000010000000000,wallflags
move.l #0,StepUpVal
move.l #$1000000,StepDownVal
move.l #0,thingheight
move.l PLR1_Roompt,objroom
movem.l d0-d7/a0-a6,-(a7)
.again:
jsr MoveObject
tst.b hitwall
bne.s .nofurther
move.w newx,d0
sub.w oldx,d0
add.w d0,oldx
add.w d0,newx
move.w newz,d0
sub.w oldz,d0
add.w d0,oldz
add.w d0,newz
move.l newy,d0
sub.l oldy,d0
add.l d0,oldy
add.l d0,newy
bra .again
.nofurther:
movem.l (a7)+,d0-d7/a0-a6
move.l PlayerShotData,a0
move.w #19,d1
.findonefree2
move.w 12(a0),d2
blt.s .foundonefree2
adda.w #64,a0
dbra d1,.findonefree2
rts
.foundonefree2:
move.l ObjectPoints,a1
move.w (a0),d2
move.w newx,(a1,d2.w*8)
move.w newz,4(a1,d2.w*8)
move.b #1,shotstatus(a0)
move.w #0,shotgrav(a0)
move.b BULTYPE+1,shotsize(a0)
move.b #0,shotanim(a0)
move.l objroom,a1
move.w (a1),12(a0)
st worry(a0)
move.l wallhitheight,d0
move.l d0,accypos(a0)
asr.l #7,d0
move.w d0,4(a0)
rts
PLR1_nofire:
rts
TESTY: dc.l 0,0,0,0
Player2Shot:
tst.w PLR2_TimeToShoot
beq.s okcanfire2
move.w TempFrames,d0
sub.w d0,PLR2_TimeToShoot
bge PLR2_nofire
move.w #0,PLR2_TimeToShoot
bra PLR2_nofire
okcanfire2:
moveq #0,d0
move.b p2_gunselected,d0
move.b d0,tempgun
move.l LINKFILE,a6
lea GunBulletTypes(a6),a6
lea BulletAnimData-GunBulletTypes(a6),a5
lea (a6,d0.w*8),a6
move.w G_BulletType(a6),d0 ; bullet type
move.w d0,BULTYPE
move.l #PLAYERTWOAMMO,a0
move.w (a0,d0.w*2),AmmoInMyGun
muls #B_BulStatLen,d0
add.w d0,a5
move.w B_MovementSpeed+2(a5),BulletSpd
; tst.w 12(a6)
; beq.s .itsaclick
tst.b p2_fire
beq PLR2_nofire
; bra .itsahold
;
;.itsaclick:
; tst.b p2_clicked
; beq PLR2_nofire
;
;.itsahold:
move.w PLR2_angpos,d0
move.l #SineTable,a0
lea (a0,d0.w),a0
move.w (a0),tempxdir
move.w 2048(a0),tempzdir
move.w PLR2_xoff,tempxoff
move.w PLR2_zoff,tempzoff
move.l PLR2_yoff,tempyoff
add.l #20*128,tempyoff
move.b PLR2_StoodInTop,tempStoodInTop
move.l PLR2_Roompt,tempRoompt
move.l #%10011,d7
move.w #-1,d0
move.l #0,targetydiff
move.l #$7fff,d1
move.l ZoneAdds,a3
move.l #PLR2_ObsInLine,a1
move.l ObjectData,a0
move.l #PLR2_ObjDists,a2
findclosestinline2
tst.w (a0)
blt outofline2
cmp.b #3,16(a0)
beq notlinedup2
tst.b (a1)+
beq.s notlinedup2
btst #1,17(a0)
beq.s notlinedup2
tst.w 12(a0)
blt.s notlinedup2
move.b 16(a0),d6
btst d6,d7
beq.s notlinedup2
tst.b numlives(a0)
beq.s notlinedup2
move.w (a0),d5
move.w (a2,d5.w*2),d6
move.w 4(a0),d2
ext.l d2
asl.l #7,d2
sub.l PLR2_yoff,d2
move.l d2,d3
bge.s .oknotneg
neg.l d2
.oknotneg:
divs #44,d2
cmp.w d6,d2
bgt.s notlinedup2
cmp.w d6,d1
blt.s notlinedup2
move.w d6,d1
move.l a0,a4
; We have a closer enemy lined up.
move.l d3,targetydiff
move.w d5,d0
notlinedup2:
add.w #64,a0
bra findclosestinline2
outofline2:
move.w d1,targdist
move.l targetydiff,d5
sub.l PLR2_height,d5
add.l #18*256,d5
move.w d1,closedist
move.w BulletSpd,d2
asr.w d2,d1
tst.w d1
bgt.s okdistthing2
moveq #1,d1
okdistthing2
divs d1,d5
move.w d5,bulyspd
move.w AmmoInMyGun,d2
move.w G_BulletsPerShot(a6),d1
cmp.w d1,d2
bge.s .okcanshoot
move.l PLR2_Obj,a2
move.w (a2),d0
move.l #ObjRotated,a2
move.l (a2,d0.w*8),Noisex
move.w #300,Noisevol
move.w #100,PLAYERTWONOISEVOL
move.w #12,Samplenum
clr.b notifplaying
move.b #$fb,IDNUM
jsr MakeSomeNoise
rts
.okcanshoot:
cmp.b #'s',mors
bne.s .notplr2
move.l PLR1_Obj,a2
move.w #1,ObjTimer+128(a2)
.notplr2:
move.w G_DelayBetweenShots(a6),PLR2_TimeToShoot
move.b MaxFrame,PLR2_GunFrame
sub.w d1,d2
move.l #PLAYERTWOAMMO,a2
add.w BULTYPE,a2
add.w BULTYPE,a2
move.w d2,(a2)
move.l PLR2_Obj,a2
move.w (a2),d2
move.l #ObjRotated,a2
move.l (a2,d2.w*8),Noisex
move.w #100,PLAYERTWONOISEVOL
move.w #300,Noisevol
move.w G_SoundEffect(a6),Samplenum
move.b #2,chanpick
clr.b notifplaying
movem.l d0/a0/d5/d6/d7/a6/a4/a5,-(a7)
move.b #$fb,IDNUM
jsr MakeSomeNoise
movem.l (a7)+,d0/a0/d5/d6/d7/a6/a4/a5
tst.w d0
blt nothingtoshoot2
tst.l B_Gravity(a5)
beq.s .notuseaim
move.w PLR2_AIMSPD,d2
move.w #8,d1
sub.w BulletSpd,d1
asr.w d1,d2
move.w d2,bulyspd
.notuseaim
tst.w B_VisibleOrInstant+2(a5)
beq PLR2FIREBULLET
; instant effect: check for hitting:
move.w G_BulletsPerShot(a6),d7
FIREBULLETS2:
movem.l a0/a1/d7/d0/a4/a5,-(a7)
jsr GetRand
move.l ObjectPoints,a1
move.w (a4),d1
lea (a1,d1.w*8),a1
and.w #$7fff,d0
move.w (a1),d1
sub.w PLR2_xoff,d1
muls d1,d1
move.w 4(a1),d2
sub.w PLR2_zoff,d2
muls d2,d2
add.l d2,d1
asr.l #6,d1
ext.l d0
asl.l #1,d0
cmp.l d1,d0
bgt.s .hitplr
movem.l (a7)+,a0/a1/d7/d0/a5/a4
move.l d0,-(a7)
bsr PLR2MISSINSTANT
move.l (a7)+,d0
bra.s .missplr
.hitplr:
movem.l (a7)+,a0/a1/d7/d0/a5/a4
move.l d0,-(a7)
bsr PLR2HITINSTANT
move.l (a7)+,d0
.missplr:
subq #1,d7
bgt.s FIREBULLETS2
rts
PLR2_AIMSPD: dc.l 0
nothingtoshoot2:
move.w PLR2_AIMSPD,d0
move.w #8,d1
sub.w BulletSpd,d1
asr.w d1,d0
move.w d0,bulyspd
tst.w B_VisibleOrInstant+2(a5)
beq PLR2FIREBULLET
move.w #0,bulyspd
move.w PLR2_xoff,oldx
move.w PLR2_zoff,oldz
move.w PLR2_sinval,d0
asr.w #7,d0
add.w oldx,d0
move.w d0,newx
move.w PLR2_cosval,d0
asr.w #7,d0
add.w oldz,d0
move.w d0,newz
move.l PLR2_yoff,d0
add.l #20*128,d0
move.l d0,oldy
move.l d0,d1
jsr GetRand
and.w #$fff,d0
sub.w #$800,d0
ext.l d0
add.l d0,d1
move.l d1,newy
st exitfirst
clr.b wallbounce
move.w #0,extlen
move.b #$ff,awayfromwall
move.w #%0000010000000000,wallflags
move.l #0,StepUpVal
move.l #$1000000,StepDownVal
move.l #0,thingheight
move.l PLR2_Roompt,objroom
movem.l d0-d7/a0-a6,-(a7)
.again:
jsr MoveObject
tst.b hitwall
bne.s .nofurther
move.w newx,d0
sub.w oldx,d0
add.w d0,oldx
add.w d0,newx
move.w newz,d0
sub.w oldz,d0
add.w d0,oldz
add.w d0,newz
move.l newy,d0
sub.l oldy,d0
add.l d0,oldy
add.l d0,newy
bra .again
.nofurther:
movem.l (a7)+,d0-d7/a0-a6
move.l PlayerShotData,a0
move.w #19,d1
.findonefree2
move.w 12(a0),d2
blt.s .foundonefree2
adda.w #64,a0
dbra d1,.findonefree2
rts
.foundonefree2:
move.l ObjectPoints,a1
move.w (a0),d2
move.w newx,(a1,d2.w*8)
move.w newz,4(a1,d2.w*8)
move.b #1,shotstatus(a0)
move.w #0,shotgrav(a0)
move.b BULTYPE+1,shotsize(a0)
move.b #0,shotanim(a0)
move.l objroom,a1
move.w (a1),12(a0)
st worry(a0)
move.l wallhitheight,d0
move.l d0,accypos(a0)
asr.l #7,d0
move.w d0,4(a0)
rts
PLR2_nofire:
rts
BulletSpd: dc.w 0
*******************************************************
tempyoff: dc.l 0
tempStoodInTop: dc.w 0
tempangpos: dc.w 0
tempxdir: dc.w 0
tempzdir: dc.w 0
tempgun: dc.w 0
tstfire: dc.w 0
PLR1FIREBULLET:
move.w #256,d6
move.w #256,d5
move.l #%100011,d7
move.b MaxFrame,PLR1_GunFrame
move.l PLR1_Obj,a2
bra firefive
PLR2FIREBULLET:
move.l #%10011,d7
move.w #256,d6
move.w #256,d5
move.b MaxFrame,PLR2_GunFrame
move.l PLR2_Obj,a2
firefive:
move.l PlayerShotData,a0
move.w #19,d1
.findonefree
move.w 12(a0),d0
blt.s .foundonefree
adda.w #64,a0
dbra d1,.findonefree
rts
.foundonefree
move.w B_Gravity+2(a5),shotgrav(a0)
move.b B_BounceOffWalls+3(a5),shotflags(a0)
move.b B_BounceOffFloors+3(a5),shotflags+1(a0)
move.w bulyspd,d0
cmp.w #20*128,d0
blt.s .okdownspd
move.w #20*128,d0
.okdownspd:
cmp.w #-20*128,d0
bgt.s .okupspd
move.w #-20*128,d0
.okupspd:
; add.w G_InitialYVel(a6),d0
move.w d0,bulyspd
move.l #ObjRotated,a2
move.b BULTYPE+1,shotsize(a0)
move.b B_DamageToTarget+3(a5),shotpower(a0)
move.l ObjectPoints,a1
move.w (a0),d1
lea (a1,d1.w*8),a1
move.w tempxoff,(a1)
move.w tempzoff,4(a1)
move.w tempxdir,d0
ext.l d0
move.w BulletSpd,d1
asl.l d1,d0
move.l d0,shotxvel(a0)
move.w tempzdir,d0
ext.l d0
asl.l d1,d0
move.b #2,16(a0)
move.l d0,shotzvel(a0)
move.w bulyspd,shotyvel(a0)
move.b tempStoodInTop,ObjInTop(a0)
move.w #0,shotlife(a0)
move.l d7,EnemyFlags(a0)
move.l tempRoompt,a2
move.w (a2),12(a0)
move.l tempyoff,d0
add.l #20*128,d0
move.l d0,accypos(a0)
st worry(a0)
asr.l #7,d0
move.w d0,4(a0)
rts
PLR1HITINSTANT:
; Just blow it up.
move.l PlayerShotData,a0
move.w #19,d1
.findonefree
move.w 12(a0),d2
blt.s .foundonefree
adda.w #64,a0
dbra d1,.findonefree
rts
.foundonefree:
move.b #2,16(a0)
move.l ObjectPoints,a1
move.w (a0),d2
move.l (a1,d0.w*8),(a1,d2.w*8)
move.l 4(a1,d0.w*8),4(a1,d2.w*8)
move.b #1,shotstatus(a0)
move.w #0,shotgrav(a0)
move.b BULTYPE+1,shotsize(a0)
move.b #0,shotanim(a0)
move.w 4(a4),d1
ext.l d1
asl.l #7,d1
move.l d1,accypos(a0)
move.w 12(a4),12(a0)
st worry(a0)
move.w 4(a4),4(a0)
move.w B_DamageToTarget+2(a5),d0
add.b d0,damagetaken(a4)
move.w tempxdir,d1
ext.l d1
asl.l #3,d1
swap d1
move.w d1,ImpactX(a4)
move.w tempzdir,d1
ext.l d1
asl.l #3,d1
swap d1
move.w d1,ImpactZ(a4)
rts
PLR1MISSINSTANT:
move.w PLR1_xoff,oldx
move.w PLR1_zoff,oldz
move.l PLR1_yoff,d1
add.l #20*128,d1
move.l d1,oldy
move.w (a4),d0
move.l ObjectPoints,a1
move.w (a1,d0.w*8),d2
sub.w oldx,d2
asr.w #1,d2
add.w oldx,d2
move.w d2,newx
move.w 4(a1,d0.w*8),d2
sub.w oldz,d2
asr.w #1,d2
add.w oldz,d2
move.w d2,newz
move.w 4(a0),d2
ext.l d2
asl.l #7,d2
move.l d2,newy
st exitfirst
clr.b wallbounce
move.w #0,extlen
move.b #$ff,awayfromwall
move.w #%0000010000000000,wallflags
move.l #0,StepUpVal
move.l #$1000000,StepDownVal
move.l #0,thingheight
move.l PLR1_Roompt,objroom
movem.l d0-d7/a0-a6,-(a7)
.again:
jsr MoveObject
tst.b hitwall
bne.s .nofurther
move.w newx,d1
sub.w oldx,d1
add.w d1,oldx
add.w d1,newx
move.w newz,d1
sub.w oldz,d1
add.w d1,oldz
add.w d1,newz
move.l newy,d1
sub.l oldy,d1
add.l d1,oldy
add.l d1,newy
bra .again
.nofurther:
movem.l (a7)+,d0-d7/a0-a6
move.l PlayerShotData,a0
move.w #19,d1
.findonefree2
move.w 12(a0),d2
blt.s .foundonefree2
adda.w #64,a0
dbra d1,.findonefree2
rts
.foundonefree2:
move.b #2,16(a0)
move.l ObjectPoints,a1
move.w (a0),d2
move.w newx,(a1,d2.w*8)
move.w newz,4(a1,d2.w*8)
move.b #1,shotstatus(a0)
move.w #0,shotgrav(a0)
move.b BULTYPE+1,shotsize(a0)
move.b #0,shotanim(a0)
move.l objroom,a1
move.w (a1),12(a0)
st worry(a0)
move.l newy,d1
move.l d1,accypos(a0)
asr.l #7,d1
move.w d1,4(a0)
rts
PLR2HITINSTANT:
; Just blow it up.
move.l PlayerShotData,a0
move.w #19,d1
.findonefree
move.w 12(a0),d2
blt.s .foundonefree
adda.w #64,a0
dbra d1,.findonefree
rts
.foundonefree:
move.b #2,16(a0)
move.l ObjectPoints,a1
move.w (a0),d2
move.l (a1,d0.w*8),(a1,d2.w*8)
move.l 4(a1,d0.w*8),4(a1,d2.w*8)
move.b #1,shotstatus(a0)
move.w #0,shotgrav(a0)
move.b BULTYPE+1,shotsize(a0)
move.b #0,shotanim(a0)
move.w 4(a4),d1
ext.l d1
asl.l #7,d1
move.l d1,accypos(a0)
move.w 12(a4),12(a0)
st worry(a0)
move.w 4(a4),4(a0)
move.w B_DamageToTarget+2(a5),d0
add.b d0,damagetaken(a4)
move.w tempxdir,d1
ext.l d1
asl.l #3,d1
swap d1
move.w d1,ImpactX(a4)
move.w tempzdir,d1
ext.l d1
asl.l #3,d1
swap d1
move.w d1,ImpactZ(a4)
rts
PLR2MISSINSTANT:
move.w PLR2_xoff,oldx
move.w PLR2_zoff,oldz
move.l PLR2_yoff,d1
add.l #20*128,d1
move.l d1,oldy
move.w (a4),d0
move.l ObjectPoints,a1
move.w (a1,d0.w*8),d2
sub.w oldx,d2
asr.w #1,d2
add.w oldx,d2
move.w d2,newx
move.w 4(a1,d0.w*8),d2
sub.w oldz,d2
asr.w #1,d2
add.w oldz,d2
move.w d2,newz
move.w 4(a0),d2
ext.l d2
asl.l #7,d2
move.l d2,newy
st exitfirst
clr.b wallbounce
move.w #0,extlen
move.b #$ff,awayfromwall
move.w #%0000010000000000,wallflags
move.l #0,StepUpVal
move.l #$1000000,StepDownVal
move.l #0,thingheight
move.l PLR2_Roompt,objroom
movem.l d0-d7/a0-a6,-(a7)
.again:
jsr MoveObject
tst.b hitwall
bne.s .nofurther
move.w newx,d1
sub.w oldx,d1
add.w d1,oldx
add.w d1,newx
move.w newz,d1
sub.w oldz,d1
add.w d1,oldz
add.w d1,newz
move.l newy,d1
sub.l oldy,d1
add.l d1,oldy
add.l d1,newy
bra .again
.nofurther:
movem.l (a7)+,d0-d7/a0-a6
move.l PlayerShotData,a0
move.w #19,d1
.findonefree2
move.w 12(a0),d2
blt.s .foundonefree2
adda.w #64,a0
dbra d1,.findonefree2
rts
.foundonefree2:
move.b #2,16(a0)
move.l ObjectPoints,a1
move.w (a0),d2
move.w newx,(a1,d2.w*8)
move.w newz,4(a1,d2.w*8)
move.b #1,shotstatus(a0)
move.w #0,shotgrav(a0)
move.b BULTYPE+1,shotsize(a0)
move.b #0,shotanim(a0)
move.l objroom,a1
move.w (a1),12(a0)
st worry(a0)
move.l newy,d1
move.l d1,accypos(a0)
asr.l #7,d1
move.w d1,4(a0)
rts